package com.sxt.jt808.vo.req;

import com.sxt.jt808.util.BCD;
import com.sxt.jt808.vo.DataPacket;

import io.netty.buffer.ByteBuf;


/**
 * @Author: 罗林
 * @Date: 2019-05-15
 * @Description:位置上报包
 * @Version: 1.0
 */

public class LocationMsg extends DataPacket {

    public LocationMsg(ByteBuf byteBuf) {
        super(byteBuf);
    }

    private int alarm; //告警信息 4字节
    private int statusField;//状态 4字节
    private float latitude;//纬度 4字节
    private float longitude;//经度 4字节
    private short elevation;//海拔高度 2字节
    private short speed; //速度 2字节
    private short direction; //方向 2字节
    private String time; //时间 6字节BCD
 
    
    // TODO set 和 get 方法
    public int getAlarm() {
		return alarm;
	}



	public void setAlarm(int alarm) {
		this.alarm = alarm;
	}



	public int getStatusField() {
		return statusField;
	}



	public void setStatusField(int statusField) {
		this.statusField = statusField;
	}



	public float getLatitude() {
		return latitude;
	}



	public void setLatitude(float latitude) {
		this.latitude = latitude;
	}



	public float getLongitude() {
		return longitude;
	}



	public void setLongitude(float longitude) {
		this.longitude = longitude;
	}



	public short getElevation() {
		return elevation;
	}



	public void setElevation(short elevation) {
		this.elevation = elevation;
	}



	public short getSpeed() {
		return speed;
	}



	public void setSpeed(short speed) {
		this.speed = speed;
	}



	public short getDirection() {
		return direction;
	}



	public void setDirection(short direction) {
		this.direction = direction;
	}



	public String getTime() {
		return time;
	}



	public void setTime(String time) {
		this.time = time;
	}


	/**
	 * BtyeBuf读操作主要提供以下功能：
	 * readByte：取1字节的内容；
	 * skipBytes： 跳过内容
	 * readUnsignedByte：取1字节的内容，返回（(short) (readByte() & 0xFF)）；（能把负数转换为无符号吗？）
	 * readShort：取2字节的内容，返回转换后的short类型；
	 * readUnsignedShort：取2字节的内容，返回readShort() & 0xFFFF；
	 * readMedium：取3字节的内容，返回转换后的int类型；
	 * readUnsignedMedium：取3字节的内容，返回转换后的int类型；
	 * readInt：取4字节的内容；
	 * readUnsignedInt：取4字节的内容，返回readInt() & 0xFFFFFFFFL；
	 * readLong：取8字节的内容；
	 * readChar：取1字节的内容；
	 * readFloat：取4字节的int内容，转换为float类型；
	 * readDouble：取8字节的long内容，转换为double类型；
	 * readBytes：取指定长度的内容，返回ByteBuf类型；
	 * readSlice：取指定长度的内容，返回ByteBuf类型；
	 * readBytes：取指定长度的内容到目标容器。
	 */
	@Override
    public void parseBody() {
        ByteBuf bb = this.byteBuf;
        this.setAlarm(bb.readInt());// 1. byte[0-3] 报警标志(DWORD(32))
        this.setStatusField(bb.readInt());// 2. byte[4-7] 状态(DWORD(32))
        // 3. byte[8-11] 纬度(DWORD(32)) 以度为单位的纬度值乘以10^6，精确到百万分之一度
        this.setLatitude(bb.readUnsignedInt() * 1.0F / 1000000);
        // 4. byte[12-15] 经度(DWORD(32)) 以度为单位的经度值乘以10^6，精确到百万分之一度
        this.setLongitude(bb.readUnsignedInt() * 1.0F / 1000000);
        // 5. byte[16-17] 高程(WORD(16)) 海拔高度，单位为米（ m）
        this.setElevation(bb.readShort());
        // byte[18-19] 速度(WORD) 1/10km/h
        this.setSpeed(bb.readShort());
        // byte[20-21] 方向(WORD) 0-359，正北为 0，顺时针
        this.setDirection(bb.readShort());
        // byte[22-x] 时间(BCD[6]) YY-MM-DD-hh-mm-ss
     	// GMT+8 时间，本标准中之后涉及的时间均采用此时区
        this.setTime(BCD.toBcdTimeString(readBytes(6)));
    }
}
